package com.br.negocio.dao;


import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.stereotype.Service;

import com.br.negocio.vo.CompraVO;
import com.br.negocio.vo.ContaPagarVO;

@Service("contaPagarDao")
public class ContaPagarDAO{
        
        @PersistenceContext
        private EntityManager entityManager;

        
        public void inserirContaPagar(ContaPagarVO contaPagarVO) {
                try {
                        entityManager.persist(contaPagarVO);
                } catch (Exception e) {
                        throw new RuntimeException("Erro ao inserir a conta a pagar: " + e.getMessage(), e);
                }
        }
        
        
        public void atualizarContaPagar(ContaPagarVO contaPagarVO) {
                try {
                        entityManager.merge(contaPagarVO);
                } catch (Exception e) {
                        throw new RuntimeException("Erro ao atualizar a conta a pagar: " + e.getMessage(), e);
                }
        }

        
        public void removerContaPagar(ContaPagarVO contaPagarVO) {
                try {
                        if (!entityManager.contains(contaPagarVO)) {
                                contaPagarVO = entityManager.merge(contaPagarVO);
                        }
                        entityManager.remove(contaPagarVO);
                } catch (Exception e) {
                        throw new RuntimeException("Erro ao remover a conta a pagar: " + e.getMessage(), e);
                }
        }

        
        public ContaPagarVO obterContaPagar(ContaPagarVO contaPagarVO) {
                try {
                        return entityManager.find(ContaPagarVO.class, contaPagarVO.getCodigo());
                } catch (Exception e) {
                        throw new RuntimeException("Erro ao buscar a conta a pagar: " + e.getMessage(), e);
                }
        }

        @SuppressWarnings("unchecked")
        public List<ContaPagarVO> obterListaContaPagar() {
                try {
                        List<ContaPagarVO> lista = (List<ContaPagarVO>) entityManager.createNamedQuery("loadAllContaPagar").getResultList();
                        if ((lista != null) && (!lista.isEmpty())) {
                                return lista;
                        } else {
                                return Collections.EMPTY_LIST;
                        }
                } catch (Exception e) {
                        throw new RuntimeException("Erro ao carregar as contas a pagar.", e);
                }
        }
        
        @SuppressWarnings("unchecked")
        public ArrayList<ContaPagarVO> obterListaContaPagar(CompraVO compra) {
                Query query = entityManager.createNamedQuery("loadAllContaPagarByCompra");
                query.setParameter("codcompra", compra.getCodigo());
                ArrayList<ContaPagarVO> lista = (ArrayList<ContaPagarVO>)query.getResultList();
                if (lista.isEmpty()) {
                        return null;
                } else {
                        return lista;
                }
        }

        
        @SuppressWarnings("unchecked")
        public boolean validaDuplicado(ContaPagarVO contaPagarVO) {
                Query query = entityManager.createNamedQuery("findDuplicatedContaPagar");
                query.setParameter("descricao", contaPagarVO.getDescricao());
                List lista = query.getResultList();
                if (lista.isEmpty()) {
                        return true;
                } else {
                        return false;
                }
        }

        public void setEntityManager(EntityManager entityManager) {
                this.entityManager = entityManager;
        }
        
        @SuppressWarnings("unchecked")
        public boolean pesquisaContaPagar(CompraVO compra){
                Query query = entityManager.createNamedQuery("findContaPagarByCompraPagas");
                query.setParameter("codigoCompra", compra.getCodigo());
                ArrayList<ContaPagarVO> lista = (ArrayList<ContaPagarVO>)query.getResultList();
                if (lista.isEmpty()) {
                        return true;
                } else {
                        return false;
                }
        }
}

